// 1，创建一个新的axios实例
// 2，请求拦截器，如果有token进行头部携带
// 3，响应拦截器：1，剥离无效数据，2，处理token失效
// 4，导出一个函数，调用当前的axios实例发请求，返回值promise

import axios from 'axios';
// 导入vuex
import store from '@/store';
// 导入路由
import router from '@/router';

// 导出基准地址，原因：其他地方可能不是通过axios发请求的地方可以用到基准地址
export const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
// 1，创建一个新的axios实例
const instance = axios.create({
  // axios 的一些配置，baseURL，timeout
  baseURL,
  // 时间为5000毫秒
  timeout: 5000
})

// 请求拦截器
instance.interceptors.request.use(config => {
  // 拦截业务逻辑
  // 进行请求配置的修改
  // 如果本地有token就在头部携带
  // 1，token在vuex用户信息里面，因此获取用户信息中的token值
  const token = store.state.user.profile.token
  // 判断是否有token
  if(token){
    // 有token就设置token头部
    config.headers.Authorization = 'Bearer ${token}'
  }
  return config
},err =>{
  // 请求拦截器失败
  return Promise.reject(err)
})

// 响应拦截器 1，剥离无效数据，2，处理token失效
instance.interceptors.response.use(res =>{
  // 响应成功，返回数据
  return res.data
},err =>{
  // 响应失败
  // 401状态码，进入该函数
  // err.response表示无响应
  if(err.response && err.response.status === 401){
    // 清空无效信息，跳转到登录页面，
    // 跳转需要传参（当前路由地址）给登录页码
    store.commit('user/setUser',{})
    // 当前路由地址
    // 1，在组件中：'/user?a=10' $route.path === /user  $route.fullPath === /user?a=10
    // 2，在js中：router.currentRoute 是当前路由地址，且是响应式的
    // router.currentRoute.value.fullPath 表示当前路由地址
    // 由于会有特殊字符，因此传入当前路由地址需要转码，防止解析地址出问题
    const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
    router.push('/login?redirectUrl' + fullPath)
  }
  return Promise.reject(err)
})

// 请求工具函数
export default (url,method,submitData) =>{
  // 负责发起请求：请求地址，请求方式，提交数据
  return instance ({
    url,
    method,
    // 注意：如果是get请求，需要使用params来传递submitData数据  ?a=10&c=10
    // 如果不是get请求，需要使用data来传递submitData  直接是一个请求体
    [method.toLowerCase() === 'get' ? 'params' : 'data'] :submitData
  })
}